home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_30 / play.c < prev    next >
C/C++ Source or Header  |  1995-01-01  |  3KB  |  123 lines

  1. #include "midi.h"
  2. #include <stdio.h>
  3. /* 
  4. Copright 1988, G.E.S. Consulting
  5.  
  6. INTERRUPT MODE tutorial:   PLAY and do something useful while driver
  7.     does it's thing
  8.  
  9.  
  10. NOTE:
  11. struct eventlist {
  12.     struct event *f; ptr to first event on que
  13.     struct event *c; ptr to current event on que
  14.     struct event *l; ptr to last event on que
  15.     }
  16. Library does NOT maintain  (or have knowledge of) this structure.
  17. You are free to devise you own way to manage event lists if you wish.
  18. */
  19. main(ac,av)
  20. char **av;
  21.     {
  22.     mpu_init(0); /* install driver */
  23.     
  24.     init_event_list(14); /* allocate 14,000 events for demo */
  25.     
  26.     if (reset_mpu() < 0) /* no MPU installed */
  27.         exit(1 );
  28.     
  29.     while(*(++av)) /* while there are files */
  30.         {
  31.         printf("%s...\n",*av);
  32.         play(*av); /* play em */
  33.         }
  34.     mpu_close();
  35.     }
  36. play(char *s)
  37.     {
  38.     char c,r=0;
  39.     char stopped = 0;
  40.     struct event *op,*ip,*read_event();
  41.     struct eventlist elist;
  42.     
  43.     if (read_list(&elist,s) == 0) /* load events from disk */
  44.         {
  45.          set_play_que(0,elist.f); /* tell driver where track data is */
  46.          active_tracks(TRACK_1); /* tell MPU what to play */
  47.          clear_play_counters(); /* start from beginning of track */
  48.          printf("Press a key if you want to do something else while listening...\n");
  49.          play_start(); /* go */
  50.          while(!que_done()) /* test for end of track */
  51.              if (kbhit()) /* if user wants to do something else */
  52.                 {
  53.                 getch(); /* give em a shell */
  54.                 printf("Type EXIT to return to program\n");
  55.                 system("command");
  56.                 printf("You are Back in PLAY\n");
  57.                 }
  58.         
  59.         printf("Track has finished\n"); /* all done */
  60.          
  61.          /* free up events for next song */
  62.          
  63.          op = elist.f;
  64.          while(op)
  65.              {
  66.             struct event *t = op->n;
  67.             event_free(op);
  68.             op = t;
  69.             }
  70.          }
  71.     }
  72.  
  73. /* simple disk storage routines */
  74.  
  75. read_list(struct eventlist *p,char *n) /* initialize a list from disk */
  76.     {
  77.     FILE *f;
  78.     struct event *ep;
  79.     struct event *read_event();
  80.  
  81.     printf("loading song %s\n",n);
  82.     
  83.     /* dont assume anything */
  84.     p->f = p->c = p->l = (struct event *)0;
  85.     
  86.     if ((f = fopen(n,"rb")) == (FILE *)0)
  87.         return(-1);
  88.     
  89.     while((ep=read_event(f))) /* while there are more */
  90.         {
  91.         if (p->f) /* first one */
  92.             {
  93.             p->l->n = ep;
  94.             p->l = ep;
  95.             }
  96.         else
  97.             p->f = p->c = p->l = ep; /* string em up */
  98.         };
  99.     fclose(f);
  100.     printf("song loaded\n");
  101.     return(0);
  102.     }
  103.  
  104. struct event *read_event(FILE *fp) /* read one event from disk */
  105.     {
  106.     struct event *ep = event_alloc(); /* get a place to store data */
  107.     
  108.     if (fread(&ep->tbyte,sizeof(ep->tbyte),1,fp) == 0) /* EOF */
  109.         {
  110.         event_free(ep);
  111.         return((struct event *)0);
  112.         }
  113.     
  114.     fread(&ep->status,1,sizeof(ep->status),fp);
  115.     fread(&ep->dlen,1,sizeof(ep->dlen),fp);
  116.     
  117.     if (ep->dlen)
  118.         {
  119.         fread(ep->d.data,1,ep->dlen,fp);
  120.         }
  121.     return(ep);
  122.     }
  123.